package com.luoc.common;

import com.luoc.mybatis.User;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class CommonUse {
    /**
     * 字符串中是否包含字母
     * @param str
     * @return
     */
    public static boolean containsLetter(String str) {
        Pattern pattern = Pattern.compile("[a-zA-Z]");
        Matcher matcher = pattern.matcher(str);
        return matcher.find();
    }
    /**
     * 字符串中是否包含字母
     * @param str
     * @return
     */
    public boolean containsLetter2(String str) {
        for (int i = 0; i < str.length(); i++) {
            if (Character.isLetter(str.charAt(i))) {
                return true;
            }
        }
        return false;
    }

    //判断IP是否合法
    public static boolean isIP(String IP){
        //1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类，也不属于不合法ip地址，计数时可以忽略
        String[] IParr = IP.split("\\.");
        Boolean isTrue = true;
        for (int i = 0; i < IParr.length; i++) {
            if (IParr[i].length() <= 0 || IParr[i] == "") {//非法判断
                isTrue = false;
            }
        }
        return isTrue;
    }
    //判断子网掩码是否合法
    public static boolean isMask(String mask){
        String[] maskarr = mask.split("\\.");
        boolean result = false;
        //0000 0000~ 1111 1110 八位
        //子网掩码为二进制下前面是连续的1，然后全是0。（例如：255.255.255.32就是一个非法的掩码）
        // 注意二进制下全是1或者全是0均为非法
        int[] maskRange = {254, 252, 248, 240, 224, 192, 128, 0};
        List<Integer> list = new ArrayList();
        for(int i:maskRange)
            list.add(i);
        //255.255.255.
        if ("255".equals(maskarr[0])&&"255".equals(maskarr[1])&&"255".equals(maskarr[2])) {
            if (list.contains(Integer.parseInt(maskarr[3]))) {
                result=true;
            }
        }
        //255.255.
        else if("255".equals(maskarr[0])&&"255".equals(maskarr[1])){
            if(list.contains(Integer.parseInt(maskarr[2]))&&"0".equals(maskarr[3])){
                result=true;
            }
        }
        //255.
        else if("255".equals(maskarr[0])){
            if(list.contains(Integer.parseInt(maskarr[1]))&&"0".equals(maskarr[2])&&"0".equals(maskarr[3])){
                result=true;
            }
        }else if(list.contains(Integer.parseInt(maskarr[0]))){
            if("0".equals(maskarr[1])&&"0".equals(maskarr[2])&&"0".equals(maskarr[3])){
                result=true;
            }
        }
        return result;
    }//method end

    //私有IP判断
    /*10.0.0.0-10.255.255.255  172.16.0.0-172.31.255.255  192.168.0.0-192.168.255.255*/
    public static boolean isPrivateIP(String IP){
        String[] split = IP.split("\\.");
        //根据范围即可
        if(Integer.parseInt(split[0])==10) return true;
        else if(Integer.parseInt(split[0])==172&&(Integer.parseInt(split[1])>15&&Integer.parseInt(split[1])<32)){
            return true;
        }else if(Integer.parseInt(split[0])==192&&Integer.parseInt(split[1])==168){
            return true;
        }else{
            return false;
        }

    }

    /**
     * 使用Comparator进行对象比较
     */
    public void useComparator(){
        //按照年龄从小到大排序，年龄相同时按照姓名的字母顺序排序
        TreeSet<User> uSet = new TreeSet<User>(new Comparator<User>(){
            @Override
            public int compare(User o1, User o2) {
                int num = o1.getAge() - o2.getAge();
                int num2 = num == 0? o1.getName().compareTo(o2.getName()) :num ;
                return num2;
            }
        });
        uSet.add(new User());
    }

    /**
     * lambda代码示例，compareTo示例
     * @param args
     */
    public static void main(String[] args) {
        List<String> list = Arrays.asList("111","22","222","Aab");
        // 1、使用lambda表达式集合遍历
        //list.forEach(System.out::println);
        //list.forEach(s -> System.out.println(s));
        //数组排序
        /*list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });*/

        // 2、使用lambda对list进行排序
        //list.sort((o1,o2) ->o1.compareTo(o2));
        Collections.sort(list,(o1,o2) ->o1.toUpperCase().compareTo(o2.toUpperCase()));
        //list.forEach(System.out::println);


        /*List<User> newlist = list.stream()
                    .sorted(Comparator.comparing(User::getAge).reversed())
                    .collect(Collectors.toList());*/
        //降序
        /*ulist.sort((o1,o2) -> Integer.compare(o2.getScore(),o1.getScore()));*/

        // 3、使用lambda进行排序 filter对数据进行过滤
        List<String> list2 = list.stream().filter(s -> s.contains("a")).collect(Collectors.toList());
        //list2.forEach(s -> System.out.print(s+" "));

        // 4、使用lambda进行映射 map对数据进行修改
        List<Integer> list3 = list.stream().map(s -> s.length()).collect(Collectors.toList());
        //list3.forEach(s -> System.out.print(s +" "));

        /// 5、使用lambda进行规约。 0 表示初始值  reduce累加list中的数据值
        int sum = list3.stream().reduce(0, (a,b) -> a+b);
        //System.out.println(sum);


        // 6、使用lambda进行分组,将list中字符串，按字符长度为key，相同字符串长度的数据组合成新list作为value  s -> s.length()可以写为 String::length
        Map<Integer,List<String>> group = list.stream().collect(Collectors.groupingBy(s -> s.length()));
        //System.out.println(group);\

        // 7、线程
        Thread th = new Thread(() -> System.out.println("Hello World!"));
        th.start();

        //8、过滤+数据修改
        List<String> list4 = list.stream().filter(s -> s.contains("a")).map(String::toUpperCase).sorted().collect(Collectors.toList());
        list4.forEach(s -> System.out.print(s +" "));

        //遍历map，将keyset转为list
        Map<String,Boolean> map = new LinkedHashMap<String,Boolean>();
        Iterator<Map.Entry<String,Boolean>> iter = map.entrySet().iterator();
        while(iter.hasNext()){
            Map.Entry<String,Boolean> entry = iter.next();
            if(!entry.getValue()){
                iter.remove();
            }
        }
        List<String> aList = new ArrayList<>(map.keySet());

    }

}
